package com.example.redis.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;

@Configuration
public class RedisConfig {

    // 默认配置参考 RedisAutoConfiguration 自动配置类
    // Redis 缓存对象内容的序列化不使用 RedisTemplate 的配置，需要在 RedisCacheManager 中单独配置，否则缓存 Cache 对象内容值会乱码
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        redisTemplate.setDefaultSerializer(RedisSerializer.string());
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        redisTemplate.setValueSerializer(RedisSerializer.json());
        redisTemplate.setHashValueSerializer(RedisSerializer.json());
        return redisTemplate;
    }

    /**
     * Lettuce，参考 https://springdoc.cn/spring-data-redis/#redis:sentinel
     * RedisSentinelConfiguration 也可以用 PropertySource 定义，它可以让你设置以下属性。
        配置属性
            spring.redis.sentinel.master: 主节点的名称。
            spring.redis.sentinel.nodes: 以逗号分隔的主机：host:port 对
            spring.redis.sentinel.username: 与Redis Sentinel进行身份验证时应用的用户名（需要Redis 6）。
            spring.redis.sentinel.password: 在与Redis Sentinel进行身份验证时要应用的密码
     */
    // @Bean
    public RedisConnectionFactory lettuceConnectionFactory() {
        RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
                .master("mymaster")
                .sentinel("127.0.0.1", 26379)
                .sentinel("127.0.0.1", 26380);
        return new LettuceConnectionFactory(sentinelConfig);
    }

}
